package com.lyy.util;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import lombok.Data;
import lombok.SneakyThrows;

import java.security.InvalidParameterException;
import java.text.SimpleDateFormat;

/** @author JoeZhou */
@Data
public class JacksonUtil {

    private static final String DATE_PATTERN = "yyyy/MM/dd hh:mm:ss";

    /**
     * 创建Jackson框架的核心对象并进行基础配置
     *
     * @return Jackson框架的核心对象
     */
    private static ObjectMapper getObjectMapper() {
        // 创建Jackson框架的核心对象并返回
        return new ObjectMapper()
                // 设置Null值不参与序列化过程，即忽略Null值
                .setSerializationInclusion(JsonInclude.Include.NON_NULL)
                // 设置Date型数据不被序列化为时间戳
                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
                // 设置Date型数据使用自定义的日期格式进行序列化
                .setDateFormat(new SimpleDateFormat(DATE_PATTERN));
    }

    /**
     * 将响应数据格式化为JSON字符串，null值忽略，时间类型使用 `yyyy/MM/dd hh:mm:ss` 格式
     *
     * @param data 响应数据
     * @return 格式化后的字符串
     */
    @SneakyThrows
    public static String format(Object data) {
        if (null == data) {
            throw new InvalidParameterException("必要参数为空");
        }
        // 将Map/List/Set/Entity等数据结构序列化为JSON字符串并返回
        return getObjectMapper().writeValueAsString(data);
    }

    /**
     * 将JSON字符串解析成指定类型并返回。
     *
     * @param json 符合JSON格式的字符串
     * @return 参数指定的类型
     */
    @SneakyThrows
    public static <T> T parse(String json, Class<T> c) {
        if (null == json || null == c) {
            throw new InvalidParameterException("必要参数为空");
        }
        return getObjectMapper().readValue(json, c);
    }


}